#  电控
import motorfuntion as motor
import time
import RPi.GPIO as gpio
import baidu as bd

#  上位机
from PyQt5 import QtWidgets
from multiprocessing import Process,Manager  # 多进程库
# from threading import Thread
from qt_material import apply_stylesheet  #  导入美化库
import sys
from PySide2.QtWidgets import QApplication,QSizePolicy
from PySide2.QtGui import QImage, QPixmap

#  图像处理
import cv2
from PySide2.QtUiTools import QUiLoader
from PySide2.QtCore import QTimer, QSize,QThread
from PySide2.QtGui import *
from PySide2.QtCore import SIGNAL, SLOT

#  内存管理
import objgraph
import gc
import numpy

#  电控部分初始化  gpio
gpio.setmode(gpio.BOARD)
gpio.setup(22,gpio.OUT)

# # 使用gpio 18 16 用来设置pwm 控制左右吧两个风扇电机
# pin = 18
# pin1 = 16
#
# m1= 13
# m2 =15
#
# gpio.setmode(gpio.BOARD)
# gpio.setup(pin, gpio.OUT)
# gpio.setup(pin1, gpio.OUT)
# gpio.setup(m1, gpio.OUT)
# gpio.setup(m2, gpio.OUT)

# # 频率设置为72Hz
# p = gpio.PWM(pin, 72)
# p.start(0)
# p1 = gpio.PWM(pin1, 72)
# p1.start(0)

# 保存地址
img_path = "/home/pi/Downloads/bottle/test/j.jpg"

#  设计一个 类 继承qt 得 ui 界面
class Stats():
    def __init__(self):
        # 从文件中加载UI定义
        self.ui = QUiLoader().load('cv2.ui')
        self.ui.setWindowTitle("海洋垃圾打捞机器人")

         # 电机使能按键
        self.ui.motorstart.clicked.connect(self.motorgo)
        self.ui.motordown.clicked.connect(self.motordown)

        #  检测按钮的控制
        self.ui.start.clicked.connect(self.jianche)
        self.ui.break_2.clicked.connect(self.jianchebreak)

        # 设置手动模式禁用  默认是禁用得，要上电才可以使用
        self.ui.ubut.setEnabled(False)
        self.ui.dbut.setEnabled(False)
        self.ui.rbut.setEnabled(False)
        self.ui.lbut.setEnabled(False)
        self.ui.go.setEnabled(False)
        self.ui.go_up.setEnabled(False)
        self.ui.pushButton_3.setEnabled(False)
        self.ui.pushButton_4.setEnabled(False)
        self.ui.start.setEnabled(False)
        self.ui.break_2.setEnabled(False)


        #   手动 自动 slot 函数
        self.ui.go.clicked.connect(self.shoudong)
        self.ui.go_up.clicked.connect(self.zhidong)

        #  远程手动按钮
        self.ui.ubut.clicked.connect(motor.my_forwod)
        self.ui.dbut.clicked.connect(motor.my_after)
        self.ui.rbut.clicked.connect(motor.my_right)
        self.ui.lbut.clicked.connect(motor.my_left)

        #  垃圾收集轴 和压缩装置
        self.ui.pushButton_3.clicked.connect(motor.zhou)
        self.ui.pushButton_4.clicked.connect(motor.my_zou_2)

        #     摄像头按钮
        self.ui.pushButton.clicked.connect(self.camera_go)
        self.ui.pushButton_2.clicked.connect(self.camera_down)


     # 电机使能  使能后电机才上电
    def motorgo(self):
        gpio.output(22, 1)
        time.sleep(0.1)
        self.ui.motorstart.setEnabled(False)
        self.ui.go.setEnabled(True)
        self.ui.go_up.setEnabled(True)
        time.sleep(0.2)
        #  给予继电器缓冲得时间

    #  手动模式
    def shoudong(self):
        self.ui.ubut.setEnabled(True)
        self.ui.dbut.setEnabled(True)
        self.ui.rbut.setEnabled(True)
        self.ui.lbut.setEnabled(True)
        self.ui.pushButton_3.setEnabled(True)
        self.ui.pushButton_4.setEnabled(True)
        self.ui.start.setEnabled(True)
        self.ui.break_2.setEnabled(True)
        print("手动模式开启开启")

    def zhidong(self):
        gpio.output(22, 0)
        # bd.my_jc()
        self.ui.go.setEnabled(False)
        self.ui.ubut.setEnabled(False)
        self.ui.dbut.setEnabled(False)
        self.ui.rbut.setEnabled(False)
        self.ui.lbut.setEnabled(False)
        self.ui.start.setEnabled(False)
        self.ui.break_2.setEnabled(False)
        self.ui.pushButton_3.setEnabled(False)
        self.ui.pushButton_4.setEnabled(False)
        print("自动检测开始")

    #  电机下电  模式禁用
    def motordown(self):
        gpio.output(22, 0)
        time.sleep(0.1)
        motor.zhou_stop()
        motor.zhou_stop_2()
        self.ui.start.setEnabled(False)
        self.ui.break_2.setEnabled(False)
        self.ui.ubut.setEnabled(False)
        self.ui.dbut.setEnabled(False)
        self.ui.rbut.setEnabled(False)
        self.ui.lbut.setEnabled(False)
        self.ui.go.setEnabled(False)
        self.ui.go_up.setEnabled(False)
        self.ui.pushButton_3.setEnabled(False)
        self.ui.pushButton_4.setEnabled(False)
        self.ui.motorstart.setEnabled(True)

    #  检测开关槽函数
    def jianche(self):
        bd.my_bd()
        # self.ui.go_up.setEnabled(True)
        # self.ui.go.setEnabled(False)
        # self.ui.ubut.setEnabled(False)
        # self.ui.dbut.setEnabled(False)
        # self.ui.rbut.setEnabled(False)
        # self.ui.lbut.setEnabled(False)

    def jianchebreak(self):
        bd.jianchebreak()
        # self.ui.go_up.setEnabled(False)
        # self.ui.go.setEnabled(True)
        # self.ui.ubut.setEnabled(False)
        # self.ui.dbut.setEnabled(False)
        # self.ui.rbut.setEnabled(False)
        # self.ui.lbut.setEnabled(False)

    #  摄像头处理函数
    def camera_go(self):
        self.ui.pushButton.setEnabled(False)
        self.capture = cv2.VideoCapture(0)
    # self.capture.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('H', '2', '6', '4'))
        self.timer = QTimer()
        self.timer.timeout.connect(self.display_video_stream)
        self.timer.start(35)

    #  摄像头显示函数
    def display_video_stream(self):
        _, frame = self.capture.read()
        frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
        frame = cv2.flip(frame, 1)
        # 转换成原色
        img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        cv2.imwrite(img_path, img)

        image = QImage(frame, frame.shape[1], frame.shape[0],
                    frame.strides[0], QImage.Format_RGB888)


        self.ui.image_label.setPixmap(QPixmap.fromImage(image))
    #  自动填充 图像大小
        self.ui.image_label.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.ui.image_label.setScaledContents(True)
        #     强制内存回收
        gc.collect()

    #  摄像头销毁函数
    def camera_down(self):
        self.ui.pushButton.setEnabled(True)
        self.capture.release()
        self.timer.stop()
        self.ui.image_label.setPixmap(QPixmap.fromImage("/home/pi/Desktop/pyCode/zhiyuan/jichuagn.png"))
        # del self.ui.image_label  会在qt 上位机运行期间销毁image_lable ui控件


if __name__ == '__main__':
    manager = Manager()
    app = QtWidgets.QApplication(sys.argv)
    stats = QtWidgets.QMainWindow()
    apply_stylesheet(app, theme='dark_teal.xml')
    stats = Stats()
    stats.ui.move(200,50)


    stats.ui.show()

    sys.exit(app.exec_())



    gpio.cleanup()
#  清除gpio 资源



